﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CondominioG1.Persistencia.NHibernate;
using CondominioG1.Dominio;
using NHibernate.Criterion;

namespace CondominioG1.Negocio
{
    public class UsuarioService
    {
        public UsuarioDAO UsuarioDAO { get; set; }

        // Mapeo de funcionalidades
        public Usuario RegistrarUsuario(String Codigo, String Nombres, String Apellidos, String Clave, String Tipo)
        {

            // Validación de existencia de un residente con el mismo Codigo
            if (UsuarioDAO.Obtener(Codigo) != null)
                throw new Exception("Ya existe un USUARIO con el CODIGO indicado");
            if (null == Codigo || String.Empty.Equals(Codigo))
                throw new Exception("El dato CODIGO es obligatorio");
            // Validación de NOMBRES
            if (null == Nombres || String.Empty.Equals(Nombres))
                throw new Exception("El dato NOMBRE es obligatorio");
            // Validación de APELLIDOS
            if (null == Apellidos || String.Empty.Equals(Apellidos))
                throw new Exception("El dato APELLIDOS es obligatorio");
            // Validación de CLAVE
            if (null == Clave || String.Empty.Equals(Clave))
                throw new Exception("El dato CLAVE es obligatorio");
            // Validación de TIPO
            if (null == Tipo || String.Empty.Equals(Tipo))
                throw new Exception("El dato TIPO es obligatorio");

            // Generar nueva secuencia para Usuario
            Usuario usuarioACrear = new Usuario();
            usuarioACrear.Codigo = Codigo;
            usuarioACrear.Nombres = Nombres;
            usuarioACrear.Apellidos = Apellidos;
            usuarioACrear.Clave = Clave;
            usuarioACrear.Tipo = Tipo;

            Usuario UsuarioCreado = UsuarioDAO.Crear(usuarioACrear);
            return UsuarioCreado;
        }

        public Usuario ModificarUsuario(String Codigo, String Nombres, String Apellidos, String Clave, String Tipo)
        {
            // Validacion de existencia de Usuario
            Usuario UsuarioExistente = UsuarioDAO.Obtener(Codigo);
            if (null == UsuarioExistente)
                throw new Exception("El USUARIO no existe...");
            // Validación de NOMBRES
            if (null == Nombres || String.Empty.Equals(Nombres))
                throw new Exception("El dato NOMBRE es obligatorio");
            // Validación de APELLIDOS
            if (null == Apellidos || String.Empty.Equals(Apellidos))
                throw new Exception("El dato APELLIDOS es obligatorio");
            // Validación de CLAVE
            if (null == Clave || String.Empty.Equals(Clave))
                throw new Exception("El dato CORREO es obligatorio");
            // Validación de TIPO
            if (null == Tipo || String.Empty.Equals(Tipo))
                throw new Exception("El dato TIPO es obligatorio");

            Usuario usuarioAModificar = new Usuario();
            usuarioAModificar = UsuarioExistente;
            usuarioAModificar.Nombres = Nombres;
            usuarioAModificar.Apellidos = Apellidos;
            usuarioAModificar.Clave = Clave;
            usuarioAModificar.Tipo = Tipo;

            Usuario UsuarioModificado = UsuarioDAO.Modificar(usuarioAModificar);
            return UsuarioModificado;
        }

        public Usuario EliminarUsuario(String Codigo)
        {
            // Validacion de existencia de Usuario
            Usuario UsuarioExistente = UsuarioDAO.Obtener(Codigo);
            if (null == UsuarioExistente)
                throw new Exception("El USUARIO no existe...");

            Usuario Usuario = new Usuario();
            Usuario = UsuarioExistente;

            UsuarioDAO.Eliminar(Usuario);
            return Usuario;
        }

        public void EliminarUsuarios()
        {
            foreach (Usuario usuario in UsuarioDAO.Listar(DetachedCriteria.For<Usuario>()))
                UsuarioDAO.Eliminar(usuario);
        }
        
        public ICollection<Usuario> ListarTodosLosUsuarios()
        {
            return UsuarioDAO.Listar(DetachedCriteria.For<Usuario>());
        }

        public Usuario ObtenerUsuario(String idNumero)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return UsuarioDAO.Obtener(idNumero);
        }
    }
}

